
#pragma once 
//#include<iostream>
#include"Data_List.h"
#include"List_Template.h"


class system_S
{
public:
	//Scan system

	virtual void scan( char* file1, char* file2,char* optiune)=0;// default valoarea e de 6 cuvinte 

	virtual void scan(char* file1, char* file2, int value,char* optiune)=0;


};



//normal scan
class subsystem_NS:public system_S//normal scan
{
	List_C lista;//lista in care vor fi memorate cuvintele 

	int Found_Words;
	//returneaza cate un cuvant din fisier pentru a-l compara
	char*get_string(FILE*file)
	{
		while(!feof(file))
		{
			char buffer[100];
			fscanf(file,"%s",buffer);
				
			return strdup(buffer);
		}

		return "Fisier terminat!";

	}

	
	
	
	//reseteaza pointerul din fisier pentru a citi de la capat  cand este nevoie
	void reset_file(FILE*f)
	{
		fseek(f,SEEK_CUR,SEEK_SET);
	};
	//reazlizeaza scanarea fisiereleor ....
	//si printeaza in functie de optiune, rezultatul obtinut

	void Do_Scan(FILE*file1, FILE*file2, char*optiune)
	{
				
	
				FILE*rezultat=NULL;
				if(strcmp(optiune,"Da")==0)
				{
					rezultat=fopen("rezultat_scanare.txt","w");
				}
			

			char*cuvant_f2=NULL,
				*cuvant_f1=NULL;
			FILE Backup_F1;
			
			cuvant_f1=get_string(file1);
			
			
			
			
			while(strcmp(cuvant_f1,"Fisier terminat!")!= NULL)
			{
				char*mem_cuv=cuvant_f1;
				long file_position=ftell(file1);

					cuvant_f2=get_string(file2);
//trebuie verificate cuvintele introduse in ghilimele
					int ok=0;

			     if (strchr(cuvant_f1,'"')!=NULL   )
				 { 		

					 while(ok==0)
					 {
							char cuv[30];

							fscanf(file1,"%s",cuv);
							
							if (strchr(cuv,'"')!=NULL )
								ok=1;
						
					 }

					 reset_file(file2);
					 cuvant_f1=get_string(file1);
					 cuvant_f2=get_string(file2);
				 }
				while(strcmp(cuvant_f2,"Fisier terminat!")!=NULL)
				{
					if (strcmp(cuvant_f1,cuvant_f2)==NULL)
					{
						this->lista.add_data(strdup(cuvant_f1));
						this->lista.add_data(strdup(" "));

						int ok=0;

						while(ok==0)
						{
							
							cuvant_f1=get_string(file1);
			
							cuvant_f2=get_string(file2);

							if (strcmp(cuvant_f1,cuvant_f2)==NULL)
							{
					
									this->lista.add_data(cuvant_f1);
										this->lista.add_data(strdup(" "));
									 ok=0;
							}
							else ok=1;
						
						}


						if (this->lista.get_Amounth_items()>5)
						{
						   
							if(strcmp(optiune,"Da")==0)
							{
								fprintf(rezultat,"\n\nAtentie! S-a gasit o potivire intre cele 2 documente. \n Aceasta consta in urmatoarea succesiune de minim 5 cuvinte \n\n->>>>>  ");
								this->lista.print_to_file(rezultat);
								fprintf(rezultat,"  ; \n");
							
							}else{


								std::cout<<"\n\nAtentie! S-a gasit o potivire intre cele 2 documente. \n Aceasta consta in urmatoarea succesiune de minim 5 cuvinte \n\n->>>>>  ";
								this->lista.print_data();
								std::cout<<"  ; \n";
							}

						this->lista.free_list();

						mem_cuv=cuvant_f1;
						file_position=ftell(file1);
						
						this->reset_file(file2);

						}
							
						if ( strcmp(cuvant_f1,"Fisier terminat!")==0)
							cuvant_f1="Fisier terminat!";
						else {cuvant_f1=mem_cuv;
					//file1=&Backup_F1;
						fseek(file1,file_position,SEEK_SET);}

					}
					cuvant_f2=get_string(file2);
				}
				 cuvant_f1=get_string(file1);
				 
				 this->reset_file(file2);
			}
			if (rezultat)
				fclose(rezultat);
	}


public:
	//Scan system
	subsystem_NS()
	{
		this->Found_Words=0;
	}
	
	void scan( char* file1, char* file2,char*optiune)
	{
		FILE*f1=fopen(file1,"r"),*f2=fopen(file2,"r");

		this->Do_Scan(f1,f2,optiune);

	
		fclose(f1),fclose(f2);

		if (strcmp(optiune,"Da")==0)
		system("rezultat_scanare.txt");

	};// default valoarea e de  6 cuvinte

	 void scan(char* file1, char* file2, int value,char*optiune)
	 {
	    std::cout<<" \n \n Aceasta metoda nu poate fi apelata, deoarece nu apartine modului de scanare normal \n\n";
	 };

};

//advanced Scan
class subsystem_AS: public system_S//advanced scan
{



	List_C lista;//lista in care vor fi memorate cuvintele 

	int Found_Words;
	
	//returneaza cate un cuvant din fisier pentru a-l compara

		char*get_string(FILE*file)
	{
		while(!feof(file))
		{
			char buffer[100];
			fscanf(file,"%s",buffer);
				
			return strdup(buffer);
		}

		return "Fisier terminat!";

	}


	
	//reseteaza pointerul din fisier pentru a citi de la capat  cand este nevoie
	void reset_file(FILE*f)
	{
		fseek(f,SEEK_CUR,SEEK_SET);
	};

	//reazlizeaza scanarea fisiereleor ....
	//si printeaza in functie de optiune, rezultatul obtinut
	void Do_Scan(FILE*file1, FILE*file2 , int words,char*optiune)
	{
			
				FILE*rezultat=NULL;
				if(strcmp(optiune,"Da")==0)
				{
					rezultat=fopen("rezultat_scanare.txt","w");
				}
			

			char*cuvant_f2=NULL,
				*cuvant_f1=NULL;
			FILE Backup_F1;
			
			cuvant_f1=get_string(file1);
			
			
			
			
			while(strcmp(cuvant_f1,"Fisier terminat!")!= NULL)
			{
				char*mem_cuv=cuvant_f1;
				long file_position=ftell(file1);

					cuvant_f2=get_string(file2);
//trebuie verificate cuvintele introduse in ghilimele
					int ok=0;

			     if (strchr(cuvant_f1,'"')!=NULL   )
				 { 		

					 while(ok==0)
					 {
							char cuv[30];

							fscanf(file1,"%s",cuv);
							
							if (strchr(cuv,'"')!=NULL )
								ok=1;
						
					 }

					 reset_file(file2);
					 cuvant_f1=get_string(file1);
					 cuvant_f2=get_string(file2);
				 }
				while(strcmp(cuvant_f2,"Fisier terminat!")!=NULL)
				{
					if (strcmp(cuvant_f1,cuvant_f2)==NULL)
					{
						this->lista.add_data(strdup(cuvant_f1));
						this->lista.add_data(strdup(" "));

						int ok=0;

						while(ok==0)
						{
							
							cuvant_f1=get_string(file1);
			
							cuvant_f2=get_string(file2);

							if (strcmp(cuvant_f1,cuvant_f2)==NULL)
							{
					
									this->lista.add_data(cuvant_f1);
										this->lista.add_data(strdup(" "));
									 ok=0;
							}
							else ok=1;
						
						}


						if (this->lista.get_Amounth_items()>words)
						{
						   
							if(strcmp(optiune,"Da")==0)
							{
								fprintf(rezultat,"\n\nAtentie! S-a gasit o potivire intre cele 2 documente. \n Aceasta consta in urmatoarea succesiune de minim %d cuvinte \n\n->>>>>  ",words);
								this->lista.print_to_file(rezultat);
								fprintf(rezultat,"  ; \n");
							
							}else{


								printf("\n\nAtentie! S-a gasit o potivire intre cele 2 documente. \n Aceasta consta in urmatoarea succesiune de minim %d cuvinte \n\n->>>>>  ",words);
								this->lista.print_data();
								std::cout<<"  ; \n";
							}

						this->lista.free_list();

						mem_cuv=cuvant_f1;
						file_position=ftell(file1);
						
						this->reset_file(file2);

						}
							
						if ( strcmp(cuvant_f1,"Fisier terminat!")==0)
							cuvant_f1="Fisier terminat!";
						else {cuvant_f1=mem_cuv;
					//file1=&Backup_F1;
						fseek(file1,file_position,SEEK_SET);}

					}
					cuvant_f2=get_string(file2);
				}
				 cuvant_f1=get_string(file1);
				 
				 this->reset_file(file2);
			}
			if (rezultat)
				fclose(rezultat);
	
	}


public:
	//Scan system

	void scan( char* file1, char* file2,char*optiune){std::cout<<"  \n\n\n\n   ....!!!!!....         Nu se poate executa aceasta optiune! \n\n\n "; };// default valoarea e de  6 cuvinte

	 void scan(char* file1, char* file2, int value,char*optiune)		 
	 {
	 	FILE*f1=fopen(file1,"r"),*f2=fopen(file2,"r");

	

		this->Do_Scan(f1,f2, value,optiune);
	
		fclose(f1),fclose(f2);
	 
		if (strcmp(optiune,"Da")==0)
			system("rezultat_scanare.txt");

	 };
};
//Statistic scan functional complet
class subsystem_SS: public system_S
{ List_Statistic<statistic> lista;
	
//citeste cele 2 fisiere si memoreaza cuvintele
	void Read_File(FILE *f1, FILE*f2)
	{
		while(!feof(f1))
		{
			char cuv[200];	
		
			fscanf(f1,"%s",cuv);

			statistic*aux=new statistic;
		aux->aparitii_fis1=aux->aparitii_fis2=0;
			aux->cuv[0]='\0';
			

				strcpy(aux->cuv,cuv);
				aux->fill_cuv();
			if(lista.verify_for(*aux,1)==0)
				lista.add(*aux,1);

		}

		while(!feof(f2))
		{
			char cuv[200];	
		
			fscanf(f2,"%s",cuv);

			statistic*aux=new statistic;
				aux->cuv[0]='\0';
				strcpy(aux->cuv,cuv);
				aux->fill_cuv();
			aux->aparitii_fis1=aux->aparitii_fis2=0;

			if(lista.verify_for(*aux,2)==0)
				lista.add(*aux,2);

		}

	
	}
	/// printeaza rezultatele scanarii in functie de optiunea data
void prind_results(char*option)
{
	if(strcmp(option,"Da")==0){
		FILE*f=fopen("statistics.txt","w");

	fprintf(f,"             Rezultatele analizei sunt: \n");

			fprintf(f,"   Cuvant           Ap.F1   Apf2 \n");
	
			int total_f1=0, 
				total_f2=0,
				common=0;

			for(int i=0;i<lista.get_index();i++)
			{
				total_f1+=lista[i].aparitii_fis1;
				total_f2+=lista[i].aparitii_fis2;


				if ( lista[i].aparitii_fis1!=0 && lista[i].aparitii_fis2!=0)
				{
					lista[i].print_data(f);
				
					common+=lista[i].aparitii_fis1;
				}
			
			}

			fprintf(f," \n\n   Fisier 1              Fisier 2    \n\n");
			fprintf(f,"   %d cuv.                %d cuv.\n",total_f1,total_f2);
		

			fprintf(f,"\n\n Concluzie: Fisierul 1 seamana cu fisierul 2 in proportie de %f  %, \nreprezentand un procent de %f % din primul fisier!\n\n      Final analiza! \n",float((common*100)/total_f2),float((common*100)/total_f1));
	
		fclose(f);
	}
	else{

			std::cout<<"             Rezultatele analizei sunt: \n";

			std::cout<<"   Cuvant           Ap.F1   Apf2 \n";
	
			int total_f1=0, 
				total_f2=0,
				common=0;

			for(int i=0;i<lista.get_index();i++)
			{
				total_f1+=lista[i].aparitii_fis1;
				total_f2+=lista[i].aparitii_fis2;


				if ( lista[i].aparitii_fis1!=0 && lista[i].aparitii_fis2!=0)
				{
					lista[i].print_data(NULL);
				
					common+=lista[i].aparitii_fis1;
				}
			
			}

			std::cout<<" \n\n"<<"   Fisier 1        "<<"      Fisier 2    \n\n";
			std::cout<<"   "<<total_f1<<"cuv.                "<<total_f2<<"cuv.\n";
		

			std::cout<<"\n\n"<<" Concluzie: Fisierul 1 seamana cu fisierul 2 in proportie de "<< float((common*100)/total_f2)<<" %, \nreprezentand un procent de "<<float((common*100)/total_f1)<<"% din primul fisier!\n\n      Final analiza! \n";
	}		
	}
	


	public:
	//Scan system



	 void scan( char* file1, char* file2,char*optiune)
	 {
		FILE*file_1=fopen(file1,"r");
		FILE*file_2=fopen(file2,"r");




		this->Read_File(file_1,file_2);
	 
		fclose(file_1),fclose(file_2);

		this->prind_results(optiune);
		if (strcmp(optiune,"Da")==0)
		system("statistics.txt");

	 };// default valoarea e de  6 cuvinte

	 void scan(char* file1, char* file2, int value,char*optiune){
		 std::cout<<"Atentie! Nu se poate utiliza aceasta optiune!";
	 };//neimportant

};